package com.nageoffer.shortlink.project.mq.producer;

import cn.hutool.core.lang.UUID;
import com.nageoffer.shortlink.project.common.constant.RedisCacheConstant;
import com.nageoffer.shortlink.project.dto.biz.ShortLinkStatsRecordDTO;
import lombok.RequiredArgsConstructor;
import org.redisson.api.RBlockingDeque;
import org.redisson.api.RDelayedQueue;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * 延迟消费短链接统计发送者
 *
 * @author Albert
 * @since 2025-10-08 15:50:44
 */
@Component
@Deprecated
@RequiredArgsConstructor
public class DelayShortLinkStatsProducer {

    private final RedissonClient redissonClient;

    /**
     * 发送延迟消费短链接统计
     *
     * <p>说明：
     * 本方法使用 Redisson 提供的延迟队列（RDelayedQueue）机制，
     * 将短链接统计任务（ShortLinkStatsRecordDTO）延迟一段时间后再投递到阻塞队列（RBlockingDeque），
     * 由消费者线程异步处理，从而实现异步统计、削峰填谷的效果。
     */
    public void send(ShortLinkStatsRecordDTO statsRecord) {
        statsRecord.setKeys(UUID.fastUUID().toString());
        // 1、 获取 Redis 中的阻塞队列（最终任务会进入这里等待被消费者消费）
        // DELAY_QUEUE_STATS_KEY 是 Redis 的 key，用于标识该队列
        RBlockingDeque<ShortLinkStatsRecordDTO> blockingDeque = redissonClient.getBlockingDeque(RedisCacheConstant.DELAY_QUEUE_STATS_KEY);

        // 2、 基于阻塞队列创建一个延迟队列（延迟调度器）
        // 延迟队列负责在指定延时到期后，将元素自动转移到 blockingDeque 中
        RDelayedQueue<ShortLinkStatsRecordDTO> delayedQueue = redissonClient.getDelayedQueue(blockingDeque);

        // 3、 将短链接统计任务放入延迟队列
        // 参数含义：
        //  - statsRecord：待统计的短链接数据对象
        //  - 5：延迟时间
        //  - TimeUnit.SECONDS：时间单位为秒
        // 效果：任务会在 5 秒后被自动放入 blockingDeque，供消费者线程异步处理
        delayedQueue.offer(statsRecord, 5, TimeUnit.SECONDS);
    }

}
